
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of AlmacenesData.
	/// </summary>
	public class AlmacenesData : Singleton<AlmacenesData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Almacenes table by a foreign key.
		/// </summary>
		public IList<Almacenes> Listar()
		{
			var entidades = new List<Almacenes>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllAlmacenes");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Almacenes
					{
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						nombre = lector.IsDBNull(lector.GetOrdinal("nombre"))? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
						descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion"))? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Almacenes table by a foreign key.
		/// </summary>
		public Almacenes Obtener(short almacenID)
		{
			var almacenes = default(Almacenes);
			var comando = BaseDatos.GetStoredProcCommand("SelectAlmacenes");

			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					almacenes = new Almacenes
					{
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						nombre = lector.IsDBNull(lector.GetOrdinal("nombre"))? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
						descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion"))? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
					};
				}
			}
			comando.Dispose();
			return almacenes;
		}

		/// <summary>
		/// Saves a record to the Almacenes table.
		/// </summary>
		public int Agregar(Almacenes almacenes)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertAlmacenes");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenes.almacenID);
			BaseDatos.AddInParameter(comando, "nombre", DbType.String, almacenes.nombre);
			BaseDatos.AddInParameter(comando, "descripcion", DbType.String, almacenes.descripcion);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Almacenes.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Almacenes table.
		/// </summary>
		public bool Modificar(Almacenes almacenes)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateAlmacenes");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenes.almacenID);
			BaseDatos.AddInParameter(comando, "nombre", DbType.String, almacenes.nombre);
			BaseDatos.AddInParameter(comando, "descripcion", DbType.String, almacenes.descripcion);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Almacenes.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Almacenes table by its primary key.
		/// </summary>
		public bool Eliminar(short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteAlmacenes");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Almacenes.");
			comando.Dispose();
			return true;
		}

		#endregion
	}
}
